
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#pragma once
#define filename "time.txt"

/*
@description: 这里的函数用于实现“裁判员提交，管理员审核通过后，公示一小时”
@author: Juyo
*/

// 写入或更新当前时间
void writeCurrentTime(const int sportCode, const int status) {    // 状态码用于追踪此项目成绩是否已通过总管理审核，0表时未审核，2表时已审核。
    time_t currentTime;
    time(&currentTime);

    FILE* file = fopen(filename, "r");  // 读取现有的文件内容，确保没有重复写入。
    if (file == NULL) {
        perror("无法打开文件");
        return;
    }

    char buffer[256];
    char tempBuffer[1024] = "";
    int found = 0;

    // 遍历文件内容
    while (fgets(buffer, sizeof(buffer), file)) {
        int code;
        time_t recordedTime;
        int existingStatus; // 用于存储已存在的状态码

        sscanf(buffer, "%d %ld %d", &code, &recordedTime, &existingStatus);
        if (code == sportCode) {
            found = 1;
            sprintf(buffer, "%d %ld %d\n", sportCode, currentTime, status);  // 如果已经存在，则更新为最新时间和状态
        }
        strcat(tempBuffer, buffer); // 将当前行添加到临时缓冲区
    }
    fclose(file);

    file = fopen(filename, "w"); // 以写入模式打开，会清空文件
    if (file == NULL) {
        perror("无法打开文件");
        return;
    }
    // 如果没有找到sportCode，则直接添加新的记录
    if (!found) {
        sprintf(buffer, "%d %ld %d\n", sportCode, currentTime, status);
        strcat(tempBuffer, buffer);
    }
    // 写回内容到文件
    fputs(tempBuffer, file);
    fclose(file); // 关闭文件
}
// 判断当前时间与指定比赛时间是否超过一小时 且 当前是否在公示期内，以判断可否发起申诉。
int isMoreThanOneHour(const int targetCode) {
    time_t currentTime;
    time(&currentTime);

    // 读取文件中的时间
    FILE* file = fopen(filename, "r");
    if (file == NULL) {
        perror("无法打开文件");
        return -3; // 表示文件不存在
    }

    time_t recordedTime;
    int sportCode;
    int status; // 用于存储状态码

    while (fscanf(file, "%d %ld %d\n", &sportCode, &recordedTime, &status) != EOF) {
        if (sportCode == targetCode) {
            fclose(file);

            // 根据状态码判断返回值
            if (status == 0) {
                return -1; // 状态码为0，不可申诉
            }
            else if (status == 2) {
                // 比较时间，判断是否超过一小时（3600秒）
                if ((long)currentTime - (long)recordedTime > 3600) {
                    return 1; // 状态码为2且超过一小时，不可申诉
                }            
                return 0; // 状态码为2且未超过一小时，可以申诉
            }
        }
    }
    fclose(file);
    return -2; // 如果没有找到对应的记录
}

// 若总管理员未审核通过，删除指定比赛的时间记录
void deleteTimeRecord(const int sportCode) {
    FILE* file = fopen(filename, "r");
    if (file == NULL) {
        perror("无法打开文件");
        return;
    }

    char buffer[256];
    char tempBuffer[1024] = "";

    // 遍历文件内容，复制不包含指定 sportCode 的行
    while (fgets(buffer, sizeof(buffer), file)) {
        int code;
        sscanf(buffer, "%d", &code);
        if (code != sportCode) { // 如果不等于要删除的比赛代码，则添加到 tempBuffer
            strcat(tempBuffer, buffer);
        }
    }
    fclose(file);

    // 重新写入文件，只保留未被删除的记录
    file = fopen(filename, "w");
    if (file == NULL) {
        perror("无法打开文件");
        return;
    }

    fputs(tempBuffer, file); // 将更新后的内容写回文件
    fclose(file);
}
